home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / windows.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  52KB  |  2,020 lines

  1. /*
  2.  * windows.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  *    GESTION DES FENETERES sous GEM
  7.  *    
  8.  *    - resize
  9.  *    - ouverture
  10.  *    - fermeture
  11.  *    
  12.  *    - ajout dans une liste de fenetres
  13.  *    - retrait d'une liste de fenetres
  14.  *    - amener une fenˆtre au premier plan
  15.  *    - trouver une fenˆtres ds une liste selon critŠres    
  16.  *
  17.  *    - taille des ascenseurs
  18.  *    - position des ascenseurs
  19.  *
  20.  *    - options menu concernant les fenˆtres
  21.  *
  22.  * History:
  23.  * --------
  24.  * 1993: fplanque: Created
  25.  * 17.06.94: fplanque: routines de redraw extraites vers REDRAW.C
  26.  */
  27.  
  28.  
  29.      #include "!OPTIONS.H"                /* Options de compilation */         
  30.     #define    THIS_FILE    "WINDOWS.C v1.00 - 03.95"
  31.           
  32.  
  33. /*
  34.  * System headers:
  35.  */
  36.     #include    <stdio.h>                    /* header standard */
  37.     #include    <stdlib.h>                    /* header librairie de fnct std */
  38.     #include <string.h>                    /* header tt de chaines */        
  39.     #include    <tos.h>
  40.     #include    <aes.h>                        /* header AES */
  41.     #include <vdi.h>                        /* header VDI */
  42.    
  43.  
  44. /*
  45.  * Custom headers:
  46.  */
  47.     #include    "SPEC_PU.H"
  48.     #include "S_MALLOC.H"
  49.     #include "STUT_ONE.RSC\STUT_3.H"                    /* noms des objets ds le ressource */
  50.     #include "WIN_PU.H"
  51.     #include "WINDR_PU.H"
  52.     #include    "TEXT_PU.H"                        /* Infos sur texte VDI */
  53.     #include    "AESDEF.H"
  54.     #include "VDI_PU.H"
  55.     #include "DEBUG_PU.H"
  56.     #include "RTERR_PU.H"
  57.     #include "ARBPG_PU.H"
  58.     #include "ATREE_PU.H"
  59.     #include "MAIN_PU.H"
  60.     #include "MMENU_PU.H"
  61.     #include "DTDIR_PU.H"
  62.     
  63.  
  64. /*
  65.  * ------------------------ PROTOTYPES -------------------------
  66.  */
  67.  
  68.  
  69. /*
  70.  * EXTernal prototypes:
  71.  */
  72.     /* 
  73.      * Images: 
  74.      */
  75.     extern    void    pi3_optimal( int wi_ckind, int *border_x, int *border_y, int *border_w, int *border_h);
  76.     extern    int    access_image( DATAPAGE *datapage, WORK_CONTENT *content_ptr, WORK_DRAW *draw_ptr );
  77.     extern    void    open_pi3( WIPARAMS *pWiParams, DATAPAGE *content_ptr, MFDB *draw_ptr );
  78.     /* 
  79.      * Objets: 
  80.      */
  81.     extern    void    dir_optimal( int *x_full, int *y_full, int *w_full, int *h_full);
  82.     extern    void    open_dir( 
  83.                             WIPARAMS *pWiParams, 
  84.                             DATADIR *    pDataDir, 
  85.                             int x_work, int y_work, int w_work );
  86.     extern    void    efface_dir( WIPARAMS *pWiParams );
  87.     extern    char    *dir_infoline( WIPARAMS *pWiParams );
  88.     extern    char    *arbo_infoline( WIPARAMS *pWiParams );
  89.     /*
  90.      * Datas:
  91.      */
  92.     extern    BOOL dataPage_IsOpen(                 /* Out: !=0 si fen ouverte */
  93.                             DATAPAGE    *    pDataPage);    /* In: Datapage concern‚e */
  94.     extern    void dataPage_setOpenBit( 
  95.                             DATAPAGE    *    pDataPage,    /* In: Datapage concern‚e */
  96.                             BOOL             b_open );    /* In: !=0 si fen ouverte */
  97.  
  98.  
  99. /*
  100.  * PUBlic INTernal prototypes:
  101.  */
  102.     static    int    get_workYBas(                        /* Out: Coord Y Basse */
  103.                             WIPARAMS    *    pWiParams );    /* In:  Fenˆtre concern‚e */
  104.     static    int    get_workXDroit(                    /* Out: Coord X droite */
  105.                             WIPARAMS    *    pWiParams );    /* In:  Fenˆtre concern‚e */
  106.  
  107.     static    void        add_wipar_ontop( WIPARAMS * *list_adr, WIPARAMS *pWiParams );
  108.     static    WIPARAMS    *take_off_wi_par( WIPARAMS * *list_adr, int wi_handle);
  109.     static    void    put_wi_on_top( WIPARAMS *pWiParams );
  110.     
  111.     static    void    set_infoline( WIPARAMS *pWiParams, char *(*infoline_text) (WIPARAMS *pWiParams) );
  112.     
  113.     static    void    update_VertSizePos( 
  114.                             WIPARAMS * pWiParams );
  115.     static    void    update_HorSizePos( 
  116.                             WIPARAMS * pWiParams );
  117.                             
  118.     static    void    set_slider_x( WIPARAMS    *pWiParams );
  119.     static    void    set_slider_y( WIPARAMS    *pWiParams );
  120.     static    void    set_slider_w( WIPARAMS    *pWiParams );
  121.     static    void    set_slider_h( WIPARAMS    *pWiParams );
  122.    
  123.     static    WIPARAMS *    findWin_byDataPage(                    /* Out: Ptr sur fenˆtre trouv‚e ou NULL */
  124.                                     DATAPAGE  *    pDataPage,             /* In:  Ptr sur datapage dont on recherche la fenˆtre ouverte */
  125.                                     WIPARAMS     *    pWiParams_list );    /* In:  Ptr sur la liste des fenˆtres */
  126.  
  127. /*
  128.  * PRIVate INTernal prototypes:
  129.  */
  130.     static    void    menu_wi_options( void );
  131.  
  132.  
  133.  
  134. /*
  135.  * ------------------------ VARIABLES -------------------------
  136.  */
  137.     
  138.  
  139. /*
  140.  * External variables: 
  141.  */
  142.     /* 
  143.      * G‚n‚ral: 
  144.      */
  145.     extern    int    G_ap_id;                        /* Identification par l'AES */
  146.     extern    int    G_x_mini, G_y_mini;        /* Coord sup gauche de l'‚cran */
  147.     extern    int    G_w_maxi, G_h_maxi;        /* Taille de l'‚cran de travail */
  148.     extern    WIPARAMS    *G_wi_list_adr;        /* Adresse de l'arbre de paramŠtres */
  149.                 WIPARAMS    *G_closed_list_adr;    /* Adresse de la liste de fen referm‚es */
  150.     extern    int    G_top_wi_handle;            /* Fenˆtre g‚r‚e par le programme */
  151.     extern    WIPARAMS    *G_selection_adr;        /* ParamŠtres de la "Fenˆtre" dans laquelle
  152.                                                             se trouve la s‚lection actuelle */
  153.     extern    char        *G_empty_string;        /* Chaine vide! */
  154.     /*
  155.      * VDI: 
  156.      */
  157.     extern    int    G_ws_handle;                /* handle virtual workstation VDI */
  158.     extern    int     G_pxyarray[18];            /* Liste de coord X,Y pour le VDI */
  159.     extern    int    G_pxyarray2[10];            /* 2Šme liste */
  160.     extern    MFDB    G_plogMFDB;                    /* block ‚cran logique */
  161.     extern    VDI_TEXT_PARAMS    G_std_text;    /* ParamŠtres du texte standard */
  162.     extern    int    G_cell_size_prop;            /* Rapport Hauteur/Largeur d'un emplacement caractŠre standard */
  163.     /* 
  164.      * Ressources: 
  165.      */
  166.     extern    OBJECT    *G_menu_adr;            /* Pointeur sur le MENU ! */
  167.     /* 
  168.      * Debug: 
  169.      */
  170.     extern    WIPARAMS    *G_debug_window;        /* Fenˆtre de d‚bugging */
  171.  
  172.  
  173. /*
  174.  * -------------------- METHODES POUR WIPARAMS --------------------------
  175.  */
  176.  
  177.  
  178. /*
  179.  * get_workYBas(-)
  180.  *
  181.  * Purpose:
  182.  * --------
  183.  * Retourne la coordonn‚e Y du bord inf‚rieur de la zone
  184.  * de travail d'une fenˆtre
  185.  *
  186.  * Algorythm:
  187.  * ----------  
  188.  * .. = coord bord sup + hauteur - 1
  189.  *
  190.  * History:
  191.  * --------
  192.  * 17.06.94: fplanque: Created
  193.  */
  194. int    get_workYBas(                        /* Out: Coord Y basse */
  195.             WIPARAMS    *    pWiParams )        /* In:  Fenˆtre concern‚e */
  196. {
  197.     return    ( pWiParams -> work_y + pWiParams -> seen_h -1 );
  198. }
  199.  
  200.  
  201. /*
  202.  * get_workXDroit(-)
  203.  *
  204.  * Purpose:
  205.  * --------
  206.  * Retourne la coordonn‚e X du bord droit de la zone
  207.  * de travail d'une fenˆtre
  208.  *
  209.  * Algorythm:
  210.  * ----------  
  211.  * .. = coord bord gauche + largeur - 1
  212.  *
  213.  * History:
  214.  * --------
  215.  * 17.06.94: fplanque: Created
  216.  */
  217. int    get_workXDroit(                    /* Out: Coord X droite */
  218.             WIPARAMS    *    pWiParams )        /* In:  Fenˆtre concern‚e */
  219. {
  220.     return    ( pWiParams -> work_x + pWiParams -> seen_w -1 );
  221. }
  222.  
  223.  
  224.  
  225.  
  226. /*
  227.  * vscroll_window(-)
  228.  *
  229.  * Purpose:
  230.  * --------
  231.  * Scrolling vertical du contenu d'une fenˆtre
  232.  *
  233.  * Algorythm:
  234.  * ----------  
  235.  * Pour certains types de fenˆtres, un scroll n'est pas rentable!
  236.  * Par exemple, lorsque l'on … d‚j… une image BITMAP du contenu
  237.  * en m‚moire, dans cas on va faire un redraw standard:
  238.  *
  239.  * History:
  240.  * --------
  241.  * 1993: fplanque: Created
  242.  * 17.06.94: teste 'OVERLAPPED' plut“t que WF_TOP
  243.  */
  244. void    vscroll_window( 
  245.             WIPARAMS *pWiParams, 
  246.             unsigned long old_pos, 
  247.             unsigned long new_pos )
  248. {
  249.     
  250.     switch( pWiParams -> type )
  251.     {
  252.         case    TYP_EMPTY:        /* Fenˆtre vide: */
  253.         case    TYP_PI3:            /* Image: */
  254.             redraw( pWiParams, G_x_mini, G_y_mini, G_w_maxi, G_h_maxi, TAKE_CTRL );    /* Redraw complet */
  255.             break;
  256.             
  257.         default:                    /* Autres types: */
  258.         {    /* 
  259.              * Un scroll a ttes les chances de se rentabiliser: 
  260.              *
  261.              * Bloque ‚cran: 
  262.              */
  263.             if( start_WINDRAW( pWiParams ) == FALSE0 )
  264.             {    /*
  265.                  * La fenˆtre est overlapp‚e: 
  266.                  * impossible de scroller: 
  267.                  *
  268.                  * Effectue un redraw bourrin de la partie "on-screen"
  269.                  * de la fenˆtre, l'envoi de messages provoquant un
  270.                  *    d‚bordement tampon AES (=>plantage!) lorsqu'on se sert 
  271.                  *    d'un ARROWED en continu: 
  272.                  *
  273.                  * Par ailleurs, certaines proc‚dures peuvent vouloir
  274.                  * un redraw imm‚diat: 
  275.                  */
  276.     
  277.                 redraw( pWiParams, G_x_mini, G_y_mini, G_w_maxi, G_h_maxi, CTRL_OK );    /* Redraw complet */
  278.     
  279.             }
  280.             else
  281.             {    /*
  282.                  * Si la fenˆtre est au top: on va la faire scroller: 
  283.                  */
  284.                 /* Variables: */
  285.                 unsigned long    deplacement = labs( new_pos - old_pos );
  286.                 int                bloc_size;
  287.  
  288.                 /* Coordonn‚es de la zone de travail: */
  289.                 int    szone_x    = pWiParams -> work_x;
  290.                 int    szone_y    = pWiParams -> work_y;
  291.                 int    szone_w    = pWiParams -> seen_w;
  292.                 int    szone_h    = pWiParams -> seen_h;
  293.     
  294.                 /* R‚duit … la partie qui se trouve vraiment sur l'‚cran: */
  295.                 rcintersect(    G_x_mini, G_y_mini, G_w_maxi, G_h_maxi,
  296.                                       &szone_x, &szone_y, &szone_w, &szone_h );
  297.         
  298.                 /*
  299.                  * Teste s'il y a une partie de l'‚cran … scroller ou non: 
  300.                  */
  301.                 if( deplacement < szone_h )
  302.                 {    /*
  303.                      * S'il y a qque chose … scroller: 
  304.                      */
  305.                     /* Taille du bloc … d‚placer: */
  306.                     bloc_size = (int) (szone_h - deplacement);
  307.             
  308.                     graf_mouse( M_OFF, NULL);            /* Efface le ptr souris */
  309.  
  310.                     /* 
  311.                      * Teste sens du d‚placement 
  312.                      */
  313.                     if ( new_pos > old_pos )
  314.                     {    /* On est descendu: */
  315.                     /* Coordonn‚es source, destination: */
  316.                         G_pxyarray[0]=szone_x;             /* Coord source */
  317.                         G_pxyarray[1]=szone_y + (int)deplacement;
  318.                         G_pxyarray[2]=szone_x + szone_w -1;
  319.                         G_pxyarray[3]=G_pxyarray[1] + bloc_size -1;
  320.                         G_pxyarray[4]=szone_x;            /* Coord destination */
  321.                         G_pxyarray[5]=szone_y;
  322.                         G_pxyarray[6]=G_pxyarray[2];
  323.                         G_pxyarray[7]=szone_y + bloc_size -1;
  324.                         /* D‚placement d'un bloc vers le haut sur l'‚cran logique: */
  325.                         vro_cpyfm( G_ws_handle, S_ONLY, G_pxyarray,
  326.                                       &G_plogMFDB, &G_plogMFDB);
  327.                         /* Fixe coord de ce qu'il reste … dessiner: */
  328.                         szone_y += bloc_size;
  329.                         szone_h = (int)deplacement;
  330.                     }
  331.                     else if ( new_pos < old_pos )
  332.                     {    /* On a mont‚: */
  333.                         /* Coordonn‚es source, destination: */
  334.                         G_pxyarray[0]=szone_x;             /* Coord source */
  335.                         G_pxyarray[1]=szone_y;
  336.                         G_pxyarray[2]=szone_x + szone_w -1;
  337.                         G_pxyarray[3]=szone_y + bloc_size -1;
  338.                         G_pxyarray[4]=szone_x;            /* Coord destination */
  339.                         G_pxyarray[5]=szone_y + (int)deplacement;
  340.                         G_pxyarray[6]=G_pxyarray[2];
  341.                         G_pxyarray[7]=G_pxyarray[5] + bloc_size -1;
  342.                         /* D‚placement d'un bloc vers le bas sur l'‚cran logique: */
  343.                         vro_cpyfm( G_ws_handle, S_ONLY, G_pxyarray,
  344.                                       &G_plogMFDB, &G_plogMFDB);
  345.                         /* Fixe coord de ce qu'il reste … dessiner: */
  346.                         szone_h = (int)deplacement;
  347.                     }
  348.                     else
  349.                     {    /* Pas de d‚placement: (ne devrait jamais se produire) */
  350.                         /* Fixe coord de ce qu'il reste … dessiner: */
  351.                         szone_h = 0;
  352.                     }
  353.  
  354.                     graf_mouse( M_ON, 0);                /* Affiche le ptr souris */
  355.                 }
  356.     
  357.                 /*
  358.                  * Effectue un redraw de la partie d'‚cran qui n'a pas pu ˆtre
  359.                  * trait‚e par scrolling: 
  360.                  */
  361.                 redraw( pWiParams, szone_x, szone_y, szone_w, szone_h, CTRL_OK );
  362.     
  363.             }
  364.             
  365.             /*
  366.              * rend le contr“le de l'‚cran: 
  367.              */
  368.             end_WINDRAW();
  369.         }
  370.     }
  371. }
  372.  
  373.  
  374.  
  375. /*
  376.  * hscroll_window(-)
  377.  *
  378.  * Purpose:
  379.  * --------
  380.  * Scrolling horizontal du contenu d'une fenˆtre
  381.  *
  382.  * Algorythm:
  383.  * ----------  
  384.  * Pour certains types de fenˆtres, un scroll n'est pas rentable!
  385.  * Par exemple, lorsque l'on … d‚j… une image BITMAP du contenu
  386.  * en m‚moire, dans cas on va faire un redraw standard:
  387.  *
  388.  * History:
  389.  * --------
  390.  * 1993: fplanque: Created
  391.  * 17.06.94: teste 'OVERLAPPED' plut“t que WF_TOP
  392.  */
  393. void    hscroll_window(
  394.             WIPARAMS *pWiParams, 
  395.             unsigned long old_pos, 
  396.             unsigned long new_pos )
  397. {
  398.     switch( pWiParams -> type )
  399.     {
  400.         case    TYP_EMPTY:        /* Fenˆtre vide: */
  401.         case    TYP_PI3:            /* Image: */
  402.             redraw( pWiParams, G_x_mini, G_y_mini, G_w_maxi, G_h_maxi, TAKE_CTRL );    /* Redraw complet */
  403.             break;
  404.             
  405.         default:                    /* Autres types: */
  406.         {    /* 
  407.              * Un scroll a ttes les chances de se rentabiliser: 
  408.              *
  409.              * Bloque ‚cran: 
  410.              */
  411.             if( start_WINDRAW( pWiParams) == FALSE0 )
  412.             {    /* 
  413.                  * La fenˆtre est overlapp‚e: 
  414.                  * impossible de scroller: 
  415.                  */
  416.     
  417.                 /* Effectue un redraw bourrin de la partie "on-screen"
  418.                 de la fenˆtre, l'envoi de messages provoquant un
  419.                 d‚bordement tampon AES (=>plantage!) lorsqu'on se sert 
  420.                 d'un ARROWED en continu: */
  421.                 /* Par ailleurs, certaines proc‚dures peuvent vouloir un redraw imm‚diat: */
  422.     
  423.                 redraw( pWiParams, G_x_mini, G_y_mini, G_w_maxi, G_h_maxi, CTRL_OK );    /* Redraw complet */
  424.     
  425.             }
  426.             else
  427.             {    /* Si la fenˆtre est au top: on va la faire scroller: */
  428.             /* Variables: */
  429.                 unsigned long    deplacement = labs( new_pos - old_pos );
  430.                 int                bloc_size;
  431.  
  432.             /* Coordonn‚es de la zone de travail: */
  433.                 int    szone_x    = pWiParams -> work_x;
  434.                 int    szone_y    = pWiParams -> work_y;
  435.                 int    szone_w    = pWiParams -> seen_w;
  436.                 int    szone_h    = pWiParams -> seen_h;
  437.     
  438.             /* R‚duit … la partie qui se trouve vraiment sur l'‚cran: */
  439.                 rcintersect(    G_x_mini, G_y_mini, G_w_maxi, G_h_maxi,
  440.                                       &szone_x, &szone_y, &szone_w, &szone_h );
  441.         
  442.             /* Teste s'il y a une partie de l'‚cran … scroller ou non: */
  443.                 if( deplacement < szone_w )
  444.                 {    /* S'il y a qque chose … scroller: */
  445.                 /* Taille du bloc … d‚placer: */
  446.                     bloc_size = (int) (szone_w - deplacement);
  447.             
  448.                     graf_mouse( M_OFF, NULL);            /* Efface le ptr souris */
  449.  
  450.                 /* Teste sens du d‚placement */
  451.                     if ( new_pos > old_pos )
  452.                     {    /* On vavers la droite: */
  453.                     /* Coordonn‚es source, destination: */
  454.                         G_pxyarray[0]=szone_x + (int)deplacement;    /* Coord source */
  455.                         G_pxyarray[1]=szone_y;
  456.                         G_pxyarray[2]=G_pxyarray[0] + bloc_size -1;
  457.                         G_pxyarray[3]=szone_y + szone_h -1;
  458.                         G_pxyarray[4]=szone_x;            /* Coord destination */
  459.                         G_pxyarray[5]=szone_y;
  460.                         G_pxyarray[6]=szone_x + bloc_size -1;
  461.                         G_pxyarray[7]=G_pxyarray[3];
  462.                     /* D‚placement d'un bloc vers la gauche sur l'‚cran logique: */
  463.                         vro_cpyfm( G_ws_handle, S_ONLY, G_pxyarray,
  464.                                       &G_plogMFDB, &G_plogMFDB);
  465.                     /* Fixe coord de ce qu'il reste … dessiner: */
  466.                         szone_x += bloc_size;
  467.                         szone_w = (int)deplacement;
  468.                     }
  469.                     else if ( new_pos < old_pos )
  470.                     {    /* On va vers la gauche: */
  471.                     /* Coordonn‚es source, destination: */
  472.                         G_pxyarray[0]=szone_x;             /* Coord source */
  473.                         G_pxyarray[1]=szone_y;
  474.                         G_pxyarray[2]=szone_x + bloc_size -1;
  475.                         G_pxyarray[3]=szone_y + szone_h -1;
  476.                         G_pxyarray[4]=szone_x + (int)deplacement;    /* Coord destination */
  477.                         G_pxyarray[5]=szone_y;
  478.                         G_pxyarray[6]=G_pxyarray[4] + bloc_size -1;
  479.                         G_pxyarray[7]=G_pxyarray[3];
  480.                     /* D‚placement d'un bloc vers la droite sur l'‚cran logique: */
  481.                         vro_cpyfm( G_ws_handle, S_ONLY, G_pxyarray,
  482.                                       &G_plogMFDB, &G_plogMFDB);
  483.                     /* Fixe coord de ce qu'il reste … dessiner: */
  484.                         szone_w = (int)deplacement;
  485.                     }
  486.                     else
  487.                     {    /* Pas de d‚placement: (ne devrait jamais se produire) */
  488.                     /* Fixe coord de ce qu'il reste … dessiner: */
  489.                         szone_w = 0;
  490.                     }
  491.  
  492.                     graf_mouse( M_ON, 0);                /* Affiche le ptr souris */
  493.  
  494.                 }
  495.     
  496.             /* Effectue un redraw de la partie d'‚cran qui n'a pas pu ˆtre
  497.                 trait‚e par scrolling: */
  498.                 redraw( pWiParams, szone_x, szone_y, szone_w, szone_h, CTRL_OK );
  499.     
  500.             }
  501.             
  502.             /*
  503.              * rend le contr“le de l'‚cran: 
  504.              */
  505.             end_WINDRAW();
  506.         }
  507.     }
  508.  
  509. }
  510.  
  511.  
  512.  
  513. /*
  514.  * wi_resize(-)
  515.  *
  516.  * Purpose:
  517.  * --------
  518.  * Changement de taille d'une fenˆtre
  519.  *
  520.  * History:
  521.  * --------
  522.  * 1993: fplanque: Created
  523.  * 13.06.94: le repositionnement et le redimensionnement des ascenseurs a ‚t‚ extrait
  524.  */
  525. void    wi_resize( WIPARAMS * pWiParams )
  526. {
  527.     /*
  528.      * Nouvelle taille de la zone de travail:
  529.      */
  530.     wind_get( pWiParams -> handle, WF_WORKXYWH,
  531.                  &(pWiParams -> work_x), &(pWiParams -> work_y), 
  532.                  &(pWiParams -> seen_w), &(pWiParams -> seen_h) );
  533.  
  534.     /*
  535.      * Repositionnement et Redimensionnement Vertical:
  536.      */
  537.     update_VertSizePos( pWiParams );
  538.  
  539.     /*
  540.      * Repositionnement et Redimensionnement Horizontal:
  541.      */
  542.     update_HorSizePos( pWiParams );
  543.  
  544. }
  545.  
  546.  
  547. /*
  548.  * update_VertSizePos(-)
  549.  *
  550.  * Purpose:
  551.  * --------
  552.  * Mise … jour taille et position ascenseur vertical
  553.  * avec contr“le de d‚bordement.
  554.  * repositionne le contenu de la fenˆtre si traitement sp‚cial est n‚cessaire
  555.  * appell‚ par wi_resize()
  556.  *
  557.  * History:
  558.  * --------
  559.  * 13.06.94: fplanque: Extracted from wi_resize()
  560.  * 29.07.94: fplanque: Correction bug ds repositionnement: enlev‚ get_workYBas( pWiParams )
  561.  * 25.09.94: prise en compte des TYP_ERRORS
  562.  */
  563. void    update_VertSizePos( 
  564.             WIPARAMS * pWiParams )
  565. {
  566.     unsigned long    new_pos;
  567.  
  568.     set_slider_h( pWiParams );            /* Fix taille slider vertical */
  569.     
  570.     if ( ( pWiParams -> seen_y + pWiParams -> seen_h /*-1*/ ) > pWiParams -> total_h )
  571.     {    /*
  572.          * Si on d‚passe la fin du document:
  573.          */
  574.  
  575.         if( (pWiParams -> total_h) > (pWiParams -> seen_h) )
  576.         {    /*
  577.              * Si la fenˆtre ne montre pas pour autant 
  578.              * l'ENSEMBLE du document
  579.              */
  580.             new_pos = pWiParams->total_h - pWiParams -> seen_h;
  581.         }
  582.         else    
  583.         {    /*
  584.              * Si fenˆtre est devenue plus grande que document,
  585.              * peut arriver avec TYP_DIR par ex... 
  586.              */
  587.             new_pos = 0; 
  588.         }
  589.         
  590.         /*
  591.          * Repositionne les donn‚es pour qu'elles tiennent compte du
  592.          * r‚ajustement.
  593.          */
  594.         switch( pWiParams -> type )
  595.         {
  596.             case    TYP_TEXT:
  597.             case    TYP_DEBUG:
  598.             case    TYP_TRACK:
  599.             case    TYP_ERRORS:
  600.                 vmove_text( pWiParams, new_pos );
  601.                 break;
  602.  
  603.             case    TYP_DIR:
  604.                 (pWiParams -> draw_ptr.tree) -> ob_y +=
  605.                     (int) (pWiParams -> seen_y - new_pos );
  606.                 break;
  607.         }
  608.  
  609.         pWiParams->seen_y = new_pos;            /* Fixe nouvelle position */
  610.     }
  611.  
  612.     set_slider_y( pWiParams );        /* Fixe position asc */
  613. }
  614.  
  615.  
  616. /*
  617.  * update_HorSizePos(-)
  618.  *
  619.  * Purpose:
  620.  * --------
  621.  * Mise … jour taille et position ascenseur horizontal
  622.  * avec contr“le de d‚bordement.
  623.  * appell‚ par wi_resize()
  624.  *
  625.  * History:
  626.  * --------
  627.  * 13.06.94: fplanque: Extracted from wi_resize()
  628.  * 29.07.94: fplanque: Correction bug ds repositionnement
  629.  */
  630. void    update_HorSizePos( 
  631.             WIPARAMS * pWiParams )
  632. {
  633.     unsigned long    new_pos;
  634.  
  635.     set_slider_w( pWiParams );                /* Fix taille slider horizontal */
  636.     if ( ( pWiParams -> seen_x + pWiParams -> seen_w /*-1*/ ) > pWiParams -> total_w )
  637.     {    /*
  638.          * Si on d‚passe la fin du document:
  639.          */
  640.         if( pWiParams->total_w > pWiParams -> seen_w )
  641.         {
  642.             new_pos= pWiParams->total_w - pWiParams -> seen_w;
  643.         }
  644.         else    
  645.         {    /*
  646.              * Si fenˆtre plus grande que document, peut arriver avec TYP_DIR par ex... 
  647.              */
  648.             new_pos = 0; 
  649.         }
  650.         
  651.         pWiParams ->seen_x = new_pos;    /* Fixe nouvelle position */
  652.     }
  653.  
  654.     set_slider_x( pWiParams );            /* Fixe position asc */
  655. }
  656.  
  657.  
  658.  
  659. /*
  660.  * ouvre_fenetre(-)
  661.  *
  662.  * Purpose:
  663.  * --------
  664.  * Ouverture d'une fenˆtre
  665.  *
  666.  * Algorythm:
  667.  * ----------  
  668.  * - V‚rifie si fen d‚j… ouverte ou contenu lock‚  (ACCESS)
  669.  * - Fixe elements de la fenetre ainsi que taille plein ‚cran etc...
  670.  * - ...et demande … l'AES de cr‚er la fenˆtre avec ces infos
  671.  * - chargement/cr‚ation du contenu
  672.  * - Allocation d'une zone WIPARAMS
  673.  * - Fixe paramŠtres dans cette zone, y compris taille … l'ouverture
  674.  * - appelle ouvre_xxx() pour les dispositions d'affichages (remplissage formulaires etc...)
  675.  * - Cr‚e titre, infos
  676.  * - Ouverture effective: affichage a l'‚cran (AES)
  677.  *
  678.  * History:
  679.  * --------
  680.  * 1993: fplanque: Created
  681.  * 17.05.94: Ajout de commentaires
  682.  * 06.08.94: Contr“le qu'une seule fenetre max puisse etre ouverte sur une DATAPAGE donn‚e
  683.  * 25.09.94: ouverture des TYP_ERRORS
  684.  * 11.10.94: empˆche temporairement l'ouverture de plusieurs fenˆtres arbo
  685.  * 14.12.94: cr‚ation Titre/path des datapages ouvertes en fenetres
  686.  * 26.12.94: fixe positions des ascenseurs … l'ouverture
  687.  */
  688. WIPARAMS    *    ouvre_fenetre( 
  689.         int                 class, 
  690.         int                 type,
  691.         DATAGROUP    *    datagroup, 
  692.         DATADIR         *    datadir, 
  693.         DATAPAGE     *    datapage,
  694.         const char    *    titre )
  695. {
  696.     static int        default_x=0,
  697.                         default_y=0;            /* Coordonn‚es d'ouverture par defaut */
  698.  
  699.     WIPARAMS        *    pWiParams;            /* Adresse des params */
  700.     int                wi_handle;                /* handle de la fen qu'on va cr‚er */
  701.     int                wi_ckind=COMPLETE;    /* El‚ments de la fenˆtre */
  702.     int                x_full, y_full, w_full, h_full;
  703.     int                x_work, y_work, w_work, h_work;
  704.     int                access_ok = 1;            /* A priori l'accŠs aux donn‚es de la fenˆtre … ouvrir n'est pas bloqu‚ */
  705.     WORK_CONTENT    pointeur;                /* Pointeur sur le contenu de la fenˆtre */
  706.     WORK_DRAW        draw_ptr;                /* Pointeur sur infos de dessin associ‚es! */
  707.     int                ouverture_ok;            /* =0 si ouverture … foir‚ */
  708.     char    *            pMsz_CreatedTitle = NULL;
  709.                 
  710.     /* 
  711.      * On commence par v‚rifier que la fenˆtre qui nous int‚resse n'est
  712.      *    pas d‚j… ouverte ou encore que son contenu n'est pas bloqu‚: 
  713.      */
  714.     if( type == TYP_TREE )
  715.     {
  716.         if( datagroup -> root_dir != NULL && datagroup -> root_dir -> nb_dirs > 0 )
  717.         {
  718.             form_alert( 1,  "[3][|Vous ne pouvez pas ouvrir|"
  719.                                         "plusieurs fenˆtres sur|"
  720.                                         "l'arborescence]"
  721.                                         "[Abandon]" );
  722.             return    NULL;
  723.         }
  724.     }
  725.     else if( class == CLASS_DATAPAGE )
  726.     {
  727.         if ( dataPage_IsOpen( datapage ) )
  728.         {    /* 
  729.              * S'il y a d‚j… une fenˆtre ouverte sur cette DATAPAGE: 
  730.              * Trouve cette fenˆtre:
  731.              */
  732.             WIPARAMS    * wi_adr = findWin_byDataPage( datapage, G_wi_list_adr );
  733.     
  734.             /*
  735.              * on va la monter au 1er Plan: 
  736.              */
  737.             if ( wi_adr != NULL )
  738.             {
  739.                 put_wi_on_top( wi_adr );
  740.             }
  741.             else
  742.             {    /* ANORMAL */
  743.                 signale( "Impossible de trouver la fenˆtre ouverte sur cet objet" );
  744.             }    
  745.  
  746.             return    NULL;        /* Pas de fenˆtre ouverte */
  747.         }
  748.         
  749.         switch( type )
  750.         {
  751.             case TYP_TEXT:                    
  752.                 /* Si texte */
  753.                 access_ok= access_text( datapage, &pointeur, &( draw_ptr.pTextDrawPar ) );
  754.                 break;
  755.  
  756.             case TYP_PI3:
  757.                 /* Si image degas */
  758.                 access_ok= access_image( datapage, &pointeur, &draw_ptr );
  759.                 break;
  760.  
  761.             case TYP_ARBO:
  762.                 /* Si sommaire d'‚dition ARBO */
  763.                 access_ok= access_arbo( datapage, &pointeur );
  764.                 break;
  765.         
  766.             default:
  767.                 access_ok= 0;                /* AccŠs impossible! */
  768.                 signale("Type DATAPAGE inconnu => autorisation d'accŠs non d‚termin‚e");
  769.         }
  770.  
  771.         if( access_ok == 0 )
  772.         {    /*
  773.              * Si ouverture impossible:
  774.              */
  775.             return    NULL;
  776.         }
  777.  
  778.  
  779.         /*
  780.          * Signale l'ouverture d'une fenˆtre sur la DATAPAGE:
  781.          * On ne peut en ouvrir qu'une page DATAPAGE:
  782.          */
  783.         dataPage_setOpenBit( datapage, TRUE_1 );
  784.         datadir -> nb_edits ++;            /* Une fen d'‚dition d'ouverte de plus dans ce groupe */
  785.     }
  786.  
  787.  
  788.     /* 
  789.      * Si on a pu acc‚der: 
  790.      * 
  791.      * Calcul des coordonn‚es "plein ‚cran" de la fenˆtre
  792.      * Et fixe elts de la fenˆtre (Par d‚faut elle est d‚j… COMPLETE):
  793.      * Et teste si le document a le droit d'ˆtre ouvert: 
  794.      */
  795.     switch ( type )
  796.     {
  797.         case    TYP_PI3:
  798.             pi3_optimal( wi_ckind, &x_full, &y_full, &w_full, &h_full);
  799.             break;
  800.  
  801.         case    TYP_TREE:
  802.             arbotree_optimal( wi_ckind, datadir, &x_full, &y_full, &w_full, &h_full);
  803.             break;
  804.             
  805.         case    TYP_ARBO:
  806.             wi_ckind &= ~INFO;    /* Cette fenetre n'aura pas de ligne d'infos */
  807.             arboedit_optimal( wi_ckind, &x_full, &y_full, &w_full, &h_full);
  808.             y_full = G_y_mini + ( G_h_maxi - h_full )/2;
  809.             break;
  810.             
  811.         case    TYP_DIR:
  812.             dir_optimal( &x_full, &y_full, &w_full, &h_full);
  813.             break;
  814.             
  815.         case    TYP_TEXT:
  816.         case    TYP_DEBUG:
  817.         case    TYP_ERRORS:
  818.             text_optimal( wi_ckind, &x_full, &y_full, &w_full, &h_full);
  819.             break;
  820.  
  821.         case    TYP_TRACK:
  822.             wi_ckind = NAME|CLOSER|FULLER|MOVER|INFO|SIZER;
  823.             text_optimal( wi_ckind, &x_full, &y_full, &w_full, &h_full);
  824.             break;
  825.  
  826.         default:
  827.             x_full = G_x_mini;
  828.             y_full = G_y_mini;
  829.             w_full = G_w_maxi;
  830.             h_full = G_h_maxi;
  831.             break;
  832.     }
  833.  
  834.  
  835.     /* 
  836.      * Demande … l'AES de Cr‚er la fenˆtre: 
  837.      */
  838.     wi_handle=wind_create(wi_ckind, x_full, y_full, w_full, h_full);
  839.             
  840.     if ( wi_handle <= 0)
  841.     {
  842.         alert( NOMORE_WIN );        /* Plus de fenˆtre dispo */
  843.     }
  844.     else
  845.     {
  846.         /* 
  847.          * Chargement/Cr‚ation du contenu: 
  848.          */
  849.         switch( class )
  850.         {
  851.             case     CLASS_DATAPAGE:
  852.                 /*
  853.                  * R‚cupŠre chemin d'accŠs … l'objet en RAM
  854.                  * pour en faire le titre de la fenˆtre:
  855.                  */
  856.                 pMsz_CreatedTitle = page_fullpath( datadir, datapage -> nom ); 
  857.                 ouverture_ok=1;
  858.                 break;
  859.  
  860.             default:                
  861.                 switch( type )
  862.                 {
  863.                     case TYP_EMPTY:
  864.                     case TYP_TREE:                    /* Si Arborescence */
  865.                     case TYP_DIR:                    /* Si liste des pages ‚cran */
  866.                         ouverture_ok=1;
  867.                         break;
  868.             
  869.                     case TYP_TEXT:
  870.                         ouverture_ok= charge_texte( &( draw_ptr.pTextDrawPar ) );
  871.                         break;
  872.             
  873.                     case TYP_DEBUG:
  874.                         ouverture_ok= debug_CreateWinText( &( draw_ptr.pTextDrawPar ) );
  875.                         break;
  876.  
  877.                     case TYP_ERRORS:
  878.                         ouverture_ok= errors_CreateWinText( &( draw_ptr.pTextDrawPar ) );
  879.                         break;
  880.             
  881.                     case TYP_TRACK:
  882.                     {    /*
  883.                          * Tracking d'une voie:
  884.                          */
  885.                         TEXTINFO      *    pTextInfo = create_TextInfo();
  886.                         ouverture_ok = 0;
  887.                         if( pTextInfo != NULL )
  888.                         {
  889.                             TEXT_DRAWPAR *    pTextDrawPar = create_TextDrawPar( pTextInfo, 100 );
  890.                             if( pTextDrawPar != NULL )
  891.                             {
  892.                                 draw_ptr.pTextDrawPar = pTextDrawPar;
  893.                                 ouverture_ok= 1;
  894.                             }
  895.                             else
  896.                             {
  897.                                 free_formatext( pTextInfo );
  898.                             }
  899.                         }
  900.                     }
  901.                     break;
  902.             
  903.                     default:
  904.                         signale("Type de donn‚es inconnu, impossible d'y acc‚der");
  905.                 }
  906.         }
  907.  
  908.  
  909.         if ( ouverture_ok == 1)
  910.         {    /* 
  911.              * Si on a pu ouvrir le contenu: 
  912.              *
  913.              * R‚serve/R‚cupŠre une zone de params 
  914.              */
  915.  
  916.             if    ( G_closed_list_adr == NULL)        
  917.             {    /* 
  918.                  * Si pas de fenˆtres ferm‚es prˆtes a ˆtre r‚ouvertes 
  919.                  */
  920.                 pWiParams= (WIPARAMS *)MALLOC( sizeof(WIPARAMS) ) ;
  921.                         /* Cr‚ation d'un zone de paramŠtres */
  922.  
  923.                 if (pWiParams == NULL)
  924.                 {
  925.                     alert( NOMEM_OPENWIN );        /* Pas assez de mem pour ouvrir fen */
  926.                     free_String( pMsz_CreatedTitle );
  927.                     wind_delete( wi_handle );            /* LibŠre m‚moire fenˆtre */
  928.                     wi_handle = 0;                            /* Echec d'ouverture */
  929.                 }
  930.                 else
  931.                 {
  932.                     if 
  933.                     (
  934.                         default_x == 0                                /* Non initialis‚ */
  935.                         || default_x > (G_x_mini+G_w_maxi)/2        /* Trop loin dans l'‚cran */
  936.                         || default_y > (G_y_mini+G_h_maxi)/2
  937.                     )
  938.                     {    /* (R‚)-Initialisation des coordonn‚es par defaut */
  939.                         default_x = G_x_mini + G_std_text. cell_w;
  940.                         default_y = G_y_mini + G_std_text. cell_h * 0.3;
  941.                     }
  942.                     pWiParams -> curr_x = default_x;
  943.                     pWiParams -> curr_y = default_y;
  944.                     pWiParams -> curr_w = G_w_maxi/1.5;
  945.                     pWiParams -> curr_h = G_h_maxi/1.5;
  946.  
  947.                     /* Pour la prochaine fenˆtre: */
  948.                         default_x += G_std_text. cell_w * G_cell_size_prop;
  949.                         default_y += G_std_text. cell_h * 1.3;
  950.                 }
  951.             }
  952.             else
  953.             {    /*
  954.                  * Si on peut r‚cup‚rer les parms d'une ancienne fenˆtre 
  955.                  */
  956.             
  957.                 pWiParams= take_off_wi_par( &G_closed_list_adr, 0);        
  958.             }
  959.  
  960.             /* 
  961.              * Calcule la taille UTILE (de la zone de TRAVAIL) de la fenˆtre: 
  962.              */
  963.             wind_calc( WC_WORK, wi_ckind, pWiParams -> curr_x, pWiParams -> curr_y,
  964.                 pWiParams -> curr_w, pWiParams -> curr_h,
  965.                 &x_work, &y_work, &w_work, &h_work );
  966.  
  967.  
  968.             /* 
  969.              * Ouverture... 
  970.              */                            
  971.             if ( wi_handle !=0 )            /* Si on a pu ouvrir une fenˆtre*/
  972.             {
  973.                 /*
  974.                  * Fixe paramŠtres compl‚mentaires:
  975.                  */
  976.                 pWiParams -> handle        = wi_handle;
  977.                 pWiParams -> class        = class;            /* Classe de contenu */
  978.                 pWiParams -> datagroup    = datagroup;    /* Datagroup concern‚ */
  979.                 pWiParams -> datadir        = datadir;        /* Dossier concern‚ */
  980.                 pWiParams -> datapage    = datapage;        /* Page concern‚e */
  981.                 pWiParams -> type            = type;            /* Type de contenu */
  982.  
  983.                 /* 
  984.                  * Coords de la zone de travail actuelle: 
  985.                  */
  986.                 pWiParams -> work_x        =    x_work;
  987.                 pWiParams -> work_y        =    y_work;
  988.  
  989.                 /* 
  990.                  * Coordonn‚es (par d‚faut) de la fenˆtre ouverte sur le document: 
  991.                  */
  992.                 pWiParams -> seen_x    = 0;        /* Offset X */
  993.                 pWiParams -> seen_y    = 0;        /* Offset Y */
  994.  
  995.                 /* 
  996.                  * Taille actuellement affich‚e: 
  997.                  */
  998.                 pWiParams -> seen_w    = w_work;    /* Largeur */
  999.                 pWiParams -> seen_h    = h_work;    /* Hauteur */
  1000.                 
  1001.                 /* 
  1002.                  * Initialisations: 
  1003.                  */
  1004.                 pWiParams -> wi_ckind         = wi_ckind;    /* Elts actifs */
  1005.                 pWiParams -> fulled             = 0;            /* Taille normale */
  1006.                 pWiParams -> selected_icon = 0;            /* Ic“ne s‚lectionn‚e */
  1007.                 /*
  1008.                  * Par d‚faut: Pas d'Options menu 
  1009.                  */
  1010.                 pWiParams -> menu_options.save             = FALSE0;
  1011.                 pWiParams -> menu_options.saveas         = FALSE0;
  1012.                 pWiParams -> menu_options.savedisk        = FALSE0;
  1013.                 pWiParams -> menu_options.newlink         = FALSE0;
  1014.                 pWiParams -> menu_options.newpage         = FALSE0;
  1015.                 pWiParams -> menu_options.newrub            = FALSE0;
  1016.                 pWiParams -> menu_options.newtext        = FALSE0;
  1017.                 pWiParams -> menu_options.compile        = FALSE0;
  1018.                 pWiParams -> menu_options.affichage        = PARAFF_NONE;
  1019.                 /*
  1020.                  * Etats par d‚faut:
  1021.                  */
  1022.                 pWiParams -> WinFlags .b_modified        = FALSE0;    /* Contenu de la fenˆtre pas modifi‚ */
  1023.             
  1024.                 switch ( type )
  1025.                 {
  1026.                     case TYP_PI3:                    /* Degas haute r‚solution */
  1027.                         open_pi3( pWiParams, pointeur.datapage, draw_ptr.psrcMFDB );
  1028.                         break;
  1029.                         
  1030.                     case TYP_ARBO:                    /* Si sommaire d'‚dition ARBO */
  1031.                         open_arbosomm( pWiParams, pointeur.datapage );
  1032.                         break;
  1033.  
  1034.                     case TYP_TREE:                    /* Si ARBOrescence */
  1035.                         open_arbotree( pWiParams );
  1036.                         break;
  1037.  
  1038.                     case TYP_DIR:
  1039.                         open_dir( pWiParams, datadir, x_work, y_work, w_work );
  1040.                         break;
  1041.                         
  1042.                     case TYP_TEXT:
  1043.                     case TYP_DEBUG:
  1044.                     case TYP_TRACK:
  1045.                         open_text( pWiParams, draw_ptr.pTextDrawPar );
  1046.  
  1047.                         if( class == CLASS_DATAPAGE )
  1048.                         {    /*
  1049.                              * S'il s'agit d'un texte en ram:
  1050.                              * on peut le sauver en ram...
  1051.                              */
  1052.                             pWiParams -> menu_options.save = TRUE_1;
  1053.                         }
  1054.                         break;
  1055.     
  1056.                     case TYP_ERRORS:
  1057.                         errors_OpenLogWin( pWiParams, draw_ptr.pTextDrawPar );
  1058.                         break;
  1059.                                                 
  1060.                     default:
  1061.                         pWiParams -> content_ptr.x= NULL;    /* Pas de contenu */
  1062.                         pWiParams -> draw_ptr.x    = NULL;    /* Pas de contenu */
  1063.                         pWiParams -> total_w        = 1;        /* Taille totale (minimum) */
  1064.                         pWiParams -> total_h        = 1;
  1065.                         pWiParams -> h_step = G_std_text .cell_w * G_cell_size_prop;    /* Saut par 8 car */
  1066.                         pWiParams -> v_step = G_std_text .cell_h;        /* Saut par ligne */
  1067.                 }
  1068.  
  1069.                 /* 
  1070.                  * Calcule taille maximale que l'user pourra donner … la fenˆtre:
  1071.                  */
  1072.                 switch( type )
  1073.                 {                        
  1074.                     case    TYP_EMPTY:
  1075.                     case    TYP_DIR:
  1076.                         pWiParams -> maxsize_w = G_w_maxi;
  1077.                         pWiParams -> maxsize_h = G_h_maxi;
  1078.                         break;
  1079.  
  1080.                     case    TYP_TEXT:
  1081.                     case    TYP_DEBUG:
  1082.                     case    TYP_TRACK:
  1083.                     case    TYP_ERRORS:
  1084.                     {
  1085.                         int foo;
  1086.                         wind_calc( WC_BORDER, wi_ckind, 100, 100,
  1087.                         (int) pWiParams -> total_w, G_h_maxi, &foo, &foo,
  1088.                         &(pWiParams -> maxsize_w), &(pWiParams -> maxsize_h) );
  1089.                         break;                    
  1090.                     }
  1091.                         
  1092.                     default:
  1093.                     {
  1094.                         int foo;
  1095.                         /* 
  1096.                          * Calcule les coordonn‚es totales de la fenˆtre,
  1097.                          * en fonction de la taille du documenent 
  1098.                          * Peut ˆtre plus grand que l'‚cran physique,
  1099.                          *    c'est la diff‚rence avec w_full et h_full
  1100.                          *    qui sont <= … G_w_maxi et G_h_maxi... 
  1101.                          */
  1102.                         wind_calc( WC_BORDER, wi_ckind, 100, 100,
  1103.                         (int) pWiParams -> total_w, (int) pWiParams -> total_h, &foo, &foo,
  1104.                         &(pWiParams -> maxsize_w), &(pWiParams -> maxsize_h) );
  1105.                     }
  1106.                 }
  1107.  
  1108.                 /* 
  1109.                  * Cr‚e le titre 
  1110.                  */
  1111.                 if( pMsz_CreatedTitle == NULL )
  1112.                 {
  1113.                     pWiParams -> name_adr = STRDUP( titre );    /* Duplique titre fourni */
  1114.                 }
  1115.                 else
  1116.                 {
  1117.                     pWiParams -> name_adr = pMsz_CreatedTitle;
  1118.                 }
  1119.               wind_set( wi_handle, WF_NAME, pWiParams -> name_adr );
  1120.  
  1121.                 /* 
  1122.                  * Cr‚e les infos 
  1123.                  */
  1124.                 pWiParams -> info_adr = G_empty_string;    /* Par d‚faut: */
  1125.                 switch( class )
  1126.                 {
  1127.                     case    CLASS_EMPTY:
  1128.                         pWiParams -> info_adr = STRDUP(" Fenetre vide");
  1129.                         wind_set( wi_handle, WF_INFO, pWiParams -> info_adr );
  1130.                         break;
  1131.                         
  1132.                     case    CLASS_DIR:            /* Directory */
  1133.                         set_infoline( pWiParams, dir_infoline );        /* Modifie ligne d'infos */
  1134.                         break;
  1135.  
  1136.                     case    CLASS_TREE:            /* Arborescence */
  1137.                         set_infoline( pWiParams, arbo_infoline );    /* Modifie ligne d'infos */
  1138.                         break;
  1139.  
  1140.                     case    CLASS_DATAPAGE:
  1141.                     default:
  1142.                         wind_set( wi_handle, WF_INFO, pWiParams -> info_adr );
  1143.                 }
  1144.  
  1145.                 /* 
  1146.                  * Fixe tailles des ascenseurs:
  1147.                  */
  1148.                 set_slider_w( pWiParams );    /* Fix taille slider horizontal */
  1149.                 set_slider_h( pWiParams );    /* Fix taille slider vertical */
  1150.                 
  1151.                 /* 
  1152.                  * Fixe positions des ascenseurs:
  1153.                  */
  1154.                 set_slider_x( pWiParams );
  1155.                 set_slider_y( pWiParams );
  1156.  
  1157.                 /* 
  1158.                  * Contr“le de la taille d'ouverture: 
  1159.                  */
  1160.                 if ( pWiParams -> curr_w > w_full )
  1161.                 {
  1162.                     pWiParams -> curr_w = w_full;
  1163.                 }
  1164.                 if ( pWiParams -> curr_h > h_full )
  1165.                 {
  1166.                     pWiParams -> curr_h = h_full;
  1167.                 }
  1168.  
  1169.                 /* 
  1170.                  * Affiche fenˆtre 
  1171.                  */
  1172.                 add_wipar_ontop( &G_wi_list_adr, pWiParams);
  1173.                                         /* Ajoute nlle fen en tˆte de liste */
  1174.                 G_top_wi_handle=G_wi_list_adr -> handle;    /* Fenˆtre la plus en haut */
  1175.  
  1176.                 wind_open(    wi_handle,
  1177.                                  pWiParams -> curr_x, pWiParams -> curr_y,
  1178.                                 pWiParams -> curr_w, pWiParams -> curr_h);    
  1179.  
  1180.                 /* 
  1181.                  * Options menu: 
  1182.                  */    
  1183.                 menu_ienable( G_menu_adr, FERMER, 1);        /* Enable Fermer */
  1184.  
  1185.                 if ( pWiParams -> next != NULL )
  1186.                 {    /*
  1187.                      * S'il y a maintenant au moins 2 fenˆtres ouvertes 
  1188.                      */
  1189.                     menu_ienable( G_menu_adr, PREMPLAN, 1);        /* Enable Premier Plan */
  1190.                 }
  1191.  
  1192.                 /*
  1193.                  * Autres options:
  1194.                  */
  1195.                 menu_wi_options();    
  1196.  
  1197.                 /* 
  1198.                  * Retourne adresse params fenetre: 
  1199.                  */
  1200.                 return    pWiParams;
  1201.             }
  1202.         }
  1203.         else                        /* Si on a pas pu ouvrir le contenu */
  1204.         {
  1205.             wind_delete( wi_handle );            /* LibŠre m‚moire fenˆtre */
  1206.         }
  1207.     }
  1208.  
  1209.     /* 
  1210.      * On a pas pu ouvrir de fenˆtre: 
  1211.      */
  1212.     return    NULL;
  1213. }
  1214.  
  1215.  
  1216.  
  1217. /*
  1218.  * ferme_fenetre(-)
  1219.  *
  1220.  * Purpose:
  1221.  * --------
  1222.  * Fermeture d'une fenetre
  1223.  *
  1224.  * History:
  1225.  * --------
  1226.  * 1993: fplanque: Created
  1227.  * 25.09.94: lorsqu'on ferme le debug, on garde le log text pour plus tard
  1228.  * 25.09.94: gestion des fen type ERRORS
  1229.  * 14.12.94: demande s'il faut sauver avant de fermer si le doc a ‚t‚ modifi‚
  1230.  * 07.01.95: renvoie r‚sultat, prend param b_Query
  1231.  */
  1232. BOOL ferme_fenetre(                 /* Out: TRUE_1 si la fenˆtre a ‚t‚ ferm‚e */
  1233.         WIPARAMS *    pWiParams,    /* In:  fenˆtre … fermer */
  1234.         BOOL            b_Query )    /* In:  TRUE_1 si on doit demander confirmation avant perte de donn‚es */
  1235. {
  1236.     int    closed_wi_handle;
  1237.     
  1238.     if( pWiParams == NULL || G_top_wi_handle == 0 )
  1239.     {    /* 
  1240.          * Si aucune fenˆtre ouverte!
  1241.          * Cela arrive lorsque le menu n'a pas eu le temps de s'effacer aprŠs
  1242.          * fermeture de la derniŠre fen et que l'user … ‚t‚ assez rapide pour
  1243.          * y recliquer 
  1244.          */
  1245.         ping();
  1246.         return    FALSE0;
  1247.     }
  1248.  
  1249.     if( pWiParams -> WinFlags .b_modified && b_Query )
  1250.     {    /*
  1251.          * Si le contenu de la fenˆtre a ‚t‚ modifi‚,
  1252.          * Et si on est autoris‚ … demander:
  1253.          * On va proposer de sauvegarder avant de fermer
  1254.          */
  1255.         switch( alert( DLG_SAVEBEFORECLOSE ) )
  1256.         {
  1257.             case    1:
  1258.                 /*
  1259.                  * Il faut sauver:
  1260.                  */
  1261.                 sauver_ram( pWiParams );
  1262.                 break;
  1263.                 
  1264.             case    3:
  1265.                 /*
  1266.                  * Il ne faut pas fermer:
  1267.                  */
  1268.                 return    FALSE0;
  1269.         }
  1270.     }
  1271.  
  1272.     /*
  1273.      * Si au moins une fenˆtre ouverte:
  1274.      * Handle de la fen … fermer:
  1275.      */
  1276.     closed_wi_handle = pWiParams -> handle;
  1277.  
  1278.     /*
  1279.      * Suppression dans la liste des paramŠtres: 
  1280.      */
  1281.     pWiParams = take_off_wi_par( &G_wi_list_adr, closed_wi_handle );
  1282.  
  1283.     /*
  1284.      * Mise … jour des paramŠtres de la fenˆtre: 
  1285.      */
  1286.     pWiParams -> handle =0;    /* Cette fen n'aura plus de handle */             
  1287.  
  1288.     /*
  1289.      * Ajout des paramŠtres sur la tˆte de liste des fen ferm‚es 
  1290.      */
  1291.     add_wipar_ontop( &G_closed_list_adr, pWiParams);
  1292.     
  1293.     /*
  1294.      * Suppression de la fenˆtre par le systŠme: 
  1295.      */
  1296.     wind_close( closed_wi_handle );
  1297.     wind_delete( closed_wi_handle );
  1298.  
  1299.     /*
  1300.      * Supression des donn‚es en m‚moire/signalisation fermeture: 
  1301.      */
  1302.     switch( pWiParams -> class )
  1303.     {
  1304.         case    CLASS_DIR:
  1305.         {    /*
  1306.              * Efface arbre d'objets directory (& evtlmnt ICONBLKs ) 
  1307.              */
  1308.             efface_dir( pWiParams );
  1309.             break;
  1310.         }
  1311.  
  1312.         case    CLASS_TREE:
  1313.         {    /*
  1314.              * Efface arbre d'objets arbo: 
  1315.              */
  1316.             efface_arbotree( pWiParams );
  1317.             break;
  1318.         }
  1319.  
  1320.         case    CLASS_TEXT:
  1321.             switch( pWiParams -> type )
  1322.             {
  1323.                 case TYP_DEBUG:
  1324.                     /*
  1325.                      * Si on a affaire … la fenˆtre d'infos debug 
  1326.                      */
  1327.                     G_debug_window = NULL;     /* Plus de fenˆtre de debug */
  1328.                     menu_ienable( G_menu_adr, SYSTEMST, 0);    /* Disable System status */
  1329.                     /*
  1330.                      * On n'efface pas le log debug:
  1331.                      * On le garde pour la prochaine fois
  1332.                      */
  1333.                     break;
  1334.  
  1335.                 case TYP_ERRORS:
  1336.                     /*
  1337.                      * Run-Time errors:
  1338.                      */
  1339.                     errors_CloseLogWin( pWiParams );
  1340.                     break;
  1341.  
  1342.                 default:
  1343.                     /*
  1344.                      * LibŠre le texte formatt‚:
  1345.                      */
  1346.                     free_formatext( pWiParams -> draw_ptr.pTextDrawPar -> pTextInfo );
  1347.             }
  1348.  
  1349.             /*
  1350.              * LibŠre les infos d'affichage: 
  1351.              */
  1352.             FREE( pWiParams -> draw_ptr.pTextDrawPar );
  1353.  
  1354.             break;
  1355.  
  1356.         case    CLASS_DATAPAGE:
  1357.         {    /*
  1358.              * La fenˆtre contient l'‚dition d'une PAGE de donn‚es: 
  1359.              */
  1360.             switch( pWiParams -> type )
  1361.             {
  1362.                 case    TYP_TEXT:
  1363.                     /* LibŠre le texte formatt‚: */
  1364.                     free_formatext( pWiParams -> draw_ptr.pTextDrawPar -> pTextInfo );
  1365.                     /* LibŠre les infos d'affichage: */
  1366.                     FREE( pWiParams -> draw_ptr.pTextDrawPar );
  1367.                     break;
  1368.                     
  1369.                 case    TYP_PI3:
  1370.                 /* LibŠre zone MFDB: */
  1371.                     FREE( pWiParams -> draw_ptr.psrcMFDB );
  1372.                     break;
  1373.  
  1374.                 case    TYP_ARBO:
  1375.                 /* LibŠre arbre d'objets: */
  1376.                     free_arbosomm( pWiParams -> draw_ptr.tree );
  1377.                     break;
  1378.     
  1379.                 default:
  1380.                     signale("Le contenu de la fenˆtre n'a pas ‚t‚ lib‚r‚");
  1381.             }
  1382.             /*
  1383.              * Signale qu'il n'y a plus de fen ouverte sur ce doc 
  1384.              */
  1385.             dataPage_setOpenBit( pWiParams -> datapage, FALSE0 );
  1386.             /*
  1387.              * Signale une fen d'‚dition de - dans ce DATADIR: 
  1388.              */
  1389.             ((pWiParams -> datadir) -> nb_edits) --;
  1390.             /*
  1391.              * Signale une fen d'‚dition de - dans ce DATAGROUP:
  1392.              */
  1393.             /* utile uniqmt si dossiers imbriqu‚s */
  1394.             /*    ((pWiParams -> datagroup) -> nb_edits) --; */
  1395.             break;
  1396.         }
  1397.             
  1398.         default:
  1399.         {
  1400.             switch( pWiParams -> type )
  1401.             {
  1402.                 case    TYP_EMPTY:
  1403.                     break;
  1404.     
  1405.                 default:
  1406.                     signale("Le contenu de la fenˆtre n'a pas ‚t‚ lib‚r‚");
  1407.             }
  1408.         }
  1409.     }
  1410.  
  1411.     FREE( pWiParams -> name_adr );    /* LibŠre chaine Titre */
  1412.  
  1413.     if ( pWiParams -> info_adr != G_empty_string )
  1414.     {    /*
  1415.          * S'il y a une ligne d'infos: 
  1416.          */
  1417.         FREE( pWiParams -> info_adr );    /* LibŠre chaine infos */
  1418.     }
  1419.     
  1420.     /*
  1421.      * Traitement des cons‚quences … la fermeture
  1422.      * au niveau gestion des fenˆtres: 
  1423.      */
  1424.     if ( G_wi_list_adr == NULL )        /* Si plus aucune fenˆtre ouvert */
  1425.     {
  1426.         G_top_wi_handle = 0;            /* Plus de fenˆtre sup‚rieure! */
  1427.         menu_ienable( G_menu_adr, FERMER, 0);    /* Disable */
  1428.     }
  1429.     else
  1430.     {
  1431.         G_top_wi_handle = G_wi_list_adr -> handle;    
  1432.                                             /* Nlle fenˆtre sup‚rieure */
  1433.         if ( G_wi_list_adr -> next == NULL )
  1434.         {    /*
  1435.              * S'il y a maintenant plus qu'une seule fen ouverte 
  1436.              */
  1437.             menu_ienable( G_menu_adr, PREMPLAN, 0);    /* Disable Premier Plan */
  1438.         }
  1439.     }
  1440.  
  1441.     if( G_selection_adr == pWiParams )
  1442.     {    /*
  1443.          * Si la s‚lection actuelle se trouvait dans la fen ferm‚e 
  1444.          */
  1445.         no_selection();        /* Efface les flags */
  1446.     }
  1447.  
  1448.     /*
  1449.      * Options menu: 
  1450.      */
  1451.     menu_wi_options();    /* Chg options menu en fnct de la nlle fen au 1er plan */
  1452.         
  1453.     return    TRUE_1;
  1454. }
  1455.  
  1456.  
  1457.  
  1458.  
  1459.  
  1460. /*
  1461.  * add_wipar_ontop(-)
  1462.  *
  1463.  * Purpose:
  1464.  * --------
  1465.  * Ajout d'une fenêtre dans une liste de fenêtres
  1466.  *
  1467.  * History:
  1468.  * --------
  1469.  * 1993: fplanque: Created
  1470.  */
  1471. void add_wipar_ontop( WIPARAMS * *list_adr, WIPARAMS *pWiParams )
  1472. {
  1473.     pWiParams -> next = *list_adr;        /* Pointe sur la suite */
  1474.     *list_adr=pWiParams;                    /* Nlle tˆte de liste */
  1475. }
  1476.  
  1477.  
  1478.  
  1479.  
  1480. /*
  1481.  * take_off_wi_par(-)
  1482.  *
  1483.  * Purpose:
  1484.  * --------
  1485.  * Retrait d'une fenetre d'une liste de fenetres
  1486.  *
  1487.  * History:
  1488.  * --------
  1489.  * 1993: fplanque: Created
  1490.  */
  1491. WIPARAMS    *take_off_wi_par(
  1492.                 WIPARAMS * *list_adr, 
  1493.                 int wi_handle)
  1494. {
  1495.         WIPARAMS        *pWiParams;    /* Adresse des params de la fen … fermer*/
  1496.         WIPARAMS        *prec_params_adr=NULL;
  1497.                                         /* Adresse des params de la fen pr‚c‚dente*/
  1498.  
  1499.         pWiParams=*list_adr;    /* On commence par le haut de la liste */
  1500.  
  1501.         while ( (pWiParams -> handle) != wi_handle )        
  1502.                         /* Tant qu'on pointe pas sur la fen qu'on veut fermer */
  1503.         {
  1504.             prec_params_adr = pWiParams;        /* Nlle fen pr‚c‚dente */
  1505.             pWiParams = pWiParams -> next;   /* Nlle fenˆtre … tester */
  1506.         }
  1507.  
  1508.         if ( prec_params_adr == NULL )            /* Si c'‚tait la tˆte de liste */
  1509.             *list_adr = pWiParams -> next;    /* Nlle tˆte de liste*/
  1510.         else
  1511.             prec_params_adr -> next = pWiParams -> next;
  1512.                                             /* Court circuite la fenˆtre … effacer! */
  1513.  
  1514.         return pWiParams;
  1515.                         /* Adresse de la zone de params qui a ‚t‚ retir‚e */
  1516. }
  1517.  
  1518.  
  1519.  
  1520. /*
  1521.  * set_infoline(-)
  1522.  *
  1523.  * Purpose:
  1524.  * --------
  1525.  * Modifie la ligne d'informations d'une fenetre
  1526.  *
  1527.  * History:
  1528.  * --------
  1529.  * 1993: fplanque: Created
  1530.  * 10.09.94: use of free_String()
  1531.  */
  1532. void    set_infoline( 
  1533.             WIPARAMS *pWiParams, 
  1534.             char *(*infoline_text) (WIPARAMS *pWiParams) )
  1535. {
  1536.  
  1537.     char    *old_info = pWiParams -> info_adr;
  1538.  
  1539.     /*
  1540.      * Fixe nouvelle chaine d'infos: 
  1541.      */
  1542.     pWiParams -> info_adr = infoline_text( pWiParams );    /* Cr‚e une copie du tampon */
  1543.     wind_set( pWiParams -> handle, WF_INFO, pWiParams -> info_adr );
  1544.  
  1545.     /*
  1546.      * Efface ancienne chaine: 
  1547.      */
  1548.     free_String( old_info );
  1549. }
  1550.  
  1551.  
  1552. /*
  1553.  * fixform_window(-)
  1554.  *
  1555.  * Purpose:
  1556.  * --------
  1557.  * Fixe la position d'un formulaire contenu dans une fenetre
  1558.  *
  1559.  * History:
  1560.  * --------
  1561.  * 1993: fplanque: Created
  1562.  */
  1563. void    fixform_window( WIPARAMS *pWiParams )
  1564. {
  1565.  
  1566.     (pWiParams -> draw_ptr.tree) -> ob_x =
  1567.         pWiParams -> work_x - (int) (pWiParams -> seen_x) + OUTLINE_INWIN;
  1568.     (pWiParams -> draw_ptr.tree) -> ob_y =
  1569.         pWiParams -> work_y - (int) (pWiParams -> seen_y) + OUTLINE_INWIN;
  1570.  
  1571. }
  1572.  
  1573.  
  1574.  
  1575. /*
  1576.  * cycle_window(-)
  1577.  *
  1578.  * Purpose:
  1579.  * --------
  1580.  * RamŠne la fenˆtre du fond au 1er plan
  1581.  *
  1582.  * History:
  1583.  * --------
  1584.  * 1993: fplanque: Created
  1585.  * 22.11.94: fplanque: teste si fen ouverte avant d'agir
  1586.  */
  1587. void    cycle_window( void )
  1588. {
  1589.     WIPARAMS    *pWiParams = G_wi_list_adr;        /* Adresse des params */
  1590.  
  1591.     if ( pWiParams == NULL )
  1592.     {    
  1593.         ping();
  1594.     }
  1595.     else
  1596.     {    /*
  1597.          * S'il y a des fenˆtres ouvertes: 
  1598.           * Trouve fenˆtre du fond 
  1599.           */
  1600.         while( pWiParams -> next != NULL )
  1601.         {    /*
  1602.              * Tant qu'on a pas trouv‚ la derniŠre fenˆtre:
  1603.              */
  1604.             pWiParams = pWiParams -> next;    /* Passe … la suivante */
  1605.         }
  1606.  
  1607.         /* RamŠne la derniŠre fenˆtre au 1er plan: */
  1608.         put_wi_on_top( pWiParams );
  1609.  
  1610.     }
  1611. }
  1612.  
  1613.                                         
  1614.                                         
  1615. /*
  1616.  * put_wi_on_top(-)
  1617.  *
  1618.  * Purpose:
  1619.  * --------
  1620.  * Place une fenˆtre au premier plan
  1621.  *
  1622.  * History:
  1623.  * --------
  1624.  * 1993: fplanque: Created
  1625.  */
  1626. void    put_wi_on_top( WIPARAMS *pWiParams )
  1627. {
  1628.     int    wi_handle = pWiParams -> handle;
  1629.  
  1630.     wind_set( wi_handle, WF_TOP);
  1631.     G_top_wi_handle=wi_handle;        /* Nlle fenˆtre au TOP */
  1632.     take_off_wi_par( &G_wi_list_adr, wi_handle );
  1633.     add_wipar_ontop( &G_wi_list_adr, pWiParams );                    
  1634.     menu_wi_options();    /* Chg options menu en fnct de la nlle fen au 1er plan */
  1635.  
  1636. }
  1637.  
  1638.  
  1639.  
  1640. /*
  1641.  * find_datawindow2(-)
  1642.  *
  1643.  * Purpose:
  1644.  * --------
  1645.  * Trouve une fenˆtre appartenant … un certain datagroup
  1646.  *
  1647.  * Algorythm:
  1648.  * ----------  
  1649.  * La fenˆtre qu'on recherche sera rep‚r‚e d'aprŠs l'adresse de
  1650.  *    son contenu, seul point de repŠre qui ne change pas lorsque
  1651.  *    l'on efface ou que l'on ajoute des ‚l‚ments dans un directory
  1652.  *    (ce qui n'est pas le cas du no d'objet, par exemple).
  1653.  *    On repŠre donc en g‚n‚ral avec les adresses suivantes:
  1654.  *            OLD    : adr_contenu= &(DATAGROUP)
  1655.  *    Directory    : adr_contenu= &(DATADIR)
  1656.  *    Document        : adr_contenu= &(DATAPAGE)
  1657.  *
  1658.  * History:
  1659.  * --------
  1660.  * 1993: fplanque: Created
  1661.  */
  1662. WIPARAMS *find_datawindow2(
  1663.                 unsigned long adr_contenu, 
  1664.                 WIPARAMS *start )
  1665. {
  1666.     /* printf("Seeking for %lu\n", adr_contenu ); */
  1667.  
  1668.     while ( start != NULL )
  1669.     {
  1670.         /*    printf("Found:%lu\n",start -> content_ptr.x); */
  1671.  
  1672.         if (    (unsigned long) (start -> content_ptr.x) == adr_contenu )
  1673.         {    /*
  1674.              * Sort si on a trouv‚ une fen correspondant au critŠre 
  1675.              */
  1676.             return    start;    /* Adr des params de la fen correspondante ou NULL */
  1677.         }
  1678.         start = start -> next;
  1679.     }
  1680.  
  1681.     /*
  1682.      * On a pas trouv‚:
  1683.      */
  1684.     return NULL;
  1685. }
  1686.  
  1687.  
  1688.  
  1689.  
  1690. /*
  1691.  * findWin_byDataPage(-)
  1692.  *
  1693.  * Purpose:
  1694.  * --------
  1695.  * Trouve une fenˆtre ouverte sur une certaine DATAPAGE
  1696.  *
  1697.  * Algorythm:
  1698.  * ----------  
  1699.  * La fenˆtre qu'on recherche sera rep‚r‚e d'aprŠs l'adresse de
  1700.  *    sa datapage
  1701.  *
  1702.  * History:
  1703.  * --------
  1704.  * 31.05.94: fplanque: Created base on fin_datawindow()
  1705.  */
  1706. WIPARAMS *    findWin_byDataPage(                    /* Out: Ptr sur fenˆtre trouv‚e ou NULL */
  1707.                     DATAPAGE  *    pDataPage,             /* In:  Ptr sur datapage dont on recherche la fenˆtre ouverte */
  1708.                     WIPARAMS     *    pWiParams_list )    /* In:  Ptr sur la liste des fenˆtres */
  1709. {
  1710.     while ( pWiParams_list != NULL )
  1711.     {
  1712.         if ( pWiParams_list -> datapage == pDataPage )
  1713.         {    /*
  1714.              * Sort si on a trouv‚ une fen correspondant au critŠre 
  1715.              */
  1716.             return    pWiParams_list;    /* Adr des params de la fen correspondante ou NULL */
  1717.         }
  1718.         pWiParams_list = pWiParams_list -> next;
  1719.     }
  1720.  
  1721.     /*
  1722.      * On a pas trouv‚:
  1723.      */
  1724.     return NULL;
  1725. }
  1726.  
  1727.  
  1728.  
  1729.  
  1730. /*
  1731.  * ------------------- Taille/pos des Ascenseurs ------------------
  1732.  */
  1733.  
  1734.  
  1735. /*
  1736.  * set_slider_w(-)
  1737.  *
  1738.  * Purpose:
  1739.  * --------
  1740.  * Fixe taille ascenseur horizontal
  1741.  *
  1742.  * History:
  1743.  * --------
  1744.  * 1993: fplanque: Created
  1745.  */
  1746. void    set_slider_w( WIPARAMS    *pWiParams )
  1747. {
  1748.     if ( pWiParams -> wi_ckind & HSLIDE )
  1749.     {    /* S'il y a un ascenseur horizontal: */
  1750.         long    taille;        /* taille du slider */
  1751.         
  1752.         taille= ( (pWiParams -> seen_w) * (long)1000 / (pWiParams -> total_w) );    
  1753.                                                             /* Calcul fait en LONG */
  1754.         if (taille>1000)
  1755.             taille=1000;
  1756.         wind_set( pWiParams -> handle, WF_HSLSIZE, (int)taille, 0, 0, 0);
  1757.                                                                                 /* Fixe taille */
  1758.     }
  1759. }
  1760.  
  1761.  
  1762. /*
  1763.  * set_slider_h(-)
  1764.  *
  1765.  * Purpose:
  1766.  * --------
  1767.  * Fixe taille ascenseur vertical
  1768.  *
  1769.  * History:
  1770.  * --------
  1771.  * 1993: fplanque: Created
  1772.  */
  1773. void    set_slider_h( WIPARAMS    *pWiParams )
  1774. {
  1775.     if ( pWiParams -> wi_ckind & VSLIDE )
  1776.     {    /* S'il y a un ascenseur vertical: */
  1777.         long    taille;        /* taille du slider */
  1778.         
  1779.         taille= ( (pWiParams -> seen_h) * (long)1000 / (pWiParams -> total_h) );    
  1780.                                                             /* Calcul fait en LONG */
  1781.         if (taille>1000)
  1782.             taille=1000;
  1783.         wind_set( pWiParams -> handle, WF_VSLSIZE, (int)taille, 0, 0, 0);
  1784.                                                                             /* Fixe taille */
  1785.     }
  1786. }
  1787.  
  1788.  
  1789.  
  1790. /*
  1791.  * set_slider_y(-)
  1792.  *
  1793.  * Purpose:
  1794.  * --------
  1795.  * Fixe position ascenseur vertical
  1796.  *
  1797.  * History:
  1798.  * --------
  1799.  * 1993: fplanque: Created
  1800.  */
  1801. void set_slider_y( 
  1802.             WIPARAMS * pWiParams )
  1803. {
  1804.     if ( pWiParams -> wi_ckind & VSLIDE )
  1805.     {    /*
  1806.          * S'il y a un ascenseur vertical: 
  1807.          */
  1808.         long    position;                                /* position du slider */
  1809.         if ( pWiParams -> seen_h >= pWiParams -> total_h )
  1810.         {
  1811.             position = 0;
  1812.         }
  1813.         else
  1814.         {
  1815.             position= 1000 * (pWiParams -> seen_y) / 
  1816.                 (pWiParams -> total_h - pWiParams -> seen_h );    
  1817.                 /* Calcul fait en LONG */
  1818.         }
  1819.         wind_set( pWiParams -> handle, WF_VSLIDE, (int)position );
  1820.             /* Fixe position */
  1821.     }
  1822. }
  1823.  
  1824.  
  1825. /*
  1826.  * set_slider_x(-)
  1827.  *
  1828.  * Purpose:
  1829.  * --------
  1830.  * Fixe position ascenseur horizontal
  1831.  *
  1832.  * History:
  1833.  * --------
  1834.  * 1993: fplanque: Created
  1835.  */
  1836. void set_slider_x( 
  1837.             WIPARAMS    *pWiParams )
  1838. {
  1839.     if ( pWiParams -> wi_ckind & HSLIDE )
  1840.     {    /*
  1841.          * S'il y a un ascenseur horizontal: 
  1842.          */
  1843.         long    position;                                /* position du slider */
  1844.         if ( pWiParams -> seen_w >= pWiParams -> total_w )
  1845.         {
  1846.             position = 0;
  1847.         }
  1848.         else
  1849.         {
  1850.             position= 1000 * (pWiParams -> seen_x) / 
  1851.             (pWiParams -> total_w - pWiParams -> seen_w );    
  1852.             /* Calcul fait en LONG */
  1853.         }
  1854.         wind_set( pWiParams -> handle, WF_HSLIDE, (int)position );
  1855.             /* Fixe position */
  1856.     }
  1857. }
  1858.  
  1859.  
  1860. /*
  1861.  * -------------------------------------------------------
  1862.  */
  1863.  
  1864.  
  1865. /*
  1866.  * menu_wi_options(-)
  1867.  *
  1868.  * Purpose:
  1869.  * --------
  1870.  * Validation des options du menu concernant la fenˆtre au top
  1871.  *
  1872.  * History:
  1873.  * --------
  1874.  * 1993: fplanque: Created
  1875.  * 31.05.94: Ajout option 'Sauver'
  1876.  * 18.06.94: options "new text" et "compile"
  1877.  */
  1878. void    menu_wi_options( void )
  1879. {
  1880.     if    ( G_wi_list_adr != NULL )    /* S'il y a au - 1 fen ouverte: */
  1881.     {
  1882.         MENU_OPTIONS    menu_options = G_wi_list_adr -> menu_options;
  1883.  
  1884.         menu_ienable( G_menu_adr, SAUVER,    menu_options.save? 1:0 );
  1885.         menu_ienable( G_menu_adr, SAVEAS,    menu_options.saveas? 1:0 );
  1886.         menu_ienable( G_menu_adr, SAVEDISK, menu_options.savedisk? 1:0 );
  1887.         menu_ienable( G_menu_adr, MENNEWLK, menu_options.newlink? 1:0 );
  1888.         menu_ienable( G_menu_adr, MENNEWPG, menu_options.newpage? 1:0 );
  1889.         menu_ienable( G_menu_adr, MENEWRUB, menu_options.newrub? 1:0 );
  1890.         menu_ienable( G_menu_adr, MENEWTXT, menu_options.newtext? 1:0 );
  1891.         menu_ienable( G_menu_adr, MENCOMPI, menu_options.compile? 1:0 );
  1892.         menu_ienable( G_menu_adr, AFFICHAG, (menu_options.affichage != PARAFF_NONE) ? 1:0 );
  1893.     }
  1894.     else    /* Si plus aucune fenˆtre ouverte: */
  1895.     {
  1896.         menu_ienable( G_menu_adr, SAUVER,    0);    /* Disable Sauver */
  1897.         menu_ienable( G_menu_adr, SAVEAS,    0);    /* Disable Sauver */
  1898.         menu_ienable( G_menu_adr, SAVEDISK, 0);    /* Disable Sauver */
  1899.         menu_ienable( G_menu_adr, MENNEWLK, 0);    /* Disable Nouveau Lien */
  1900.         menu_ienable( G_menu_adr, MENEWRUB, 0);    /* Disable Nouvelle rubrique */
  1901.         menu_ienable( G_menu_adr, MENEWTXT, 0);    /* Disable  */
  1902.         menu_ienable( G_menu_adr, MENCOMPI, 0);    /* Disable  */
  1903.         menu_ienable( G_menu_adr, MENNEWPG, 0);    /* Disable Nouvelle page */
  1904.         menu_ienable( G_menu_adr, AFFICHAG, 0);    /* Disable Affichage */
  1905.     }
  1906. }
  1907.  
  1908.  
  1909.  
  1910.  
  1911. /*
  1912.  * Wnd_SetModified(-)
  1913.  *
  1914.  * Purpose:
  1915.  * --------
  1916.  * Positionne le flag modified
  1917.  * et traduit cet ‚tat dans le titre de la fenˆtre
  1918.  *
  1919.  * History:
  1920.  * --------
  1921.  * 14.12.94: fplanque: Created
  1922.  */
  1923. void    Wnd_SetModified(
  1924.             WIPARAMS    * pWiParams )    /* In: Fenˆtre concern‚e */
  1925. {
  1926.     char    *    pMsz_NewTitle;
  1927.     
  1928.     if( pWiParams -> WinFlags .b_modified == TRUE_1 )
  1929.     {    /*
  1930.          * On a d‚j… modifi‚ auparavent:
  1931.          */
  1932.         return;
  1933.     }
  1934.     
  1935.     /*
  1936.      * Contenu de la fenˆtre a ‚t‚ modifi‚ maintenant:
  1937.      */
  1938.     pWiParams -> WinFlags .b_modified = TRUE_1;    
  1939.     
  1940.     /*
  1941.      * Nouveau titre:
  1942.      * On augmente la longueur de 2 "* " et on oublie pas la place pour le 0 final
  1943.      */
  1944.     pMsz_NewTitle = MALLOC( strlen( pWiParams -> name_adr ) + 3 );
  1945.     pMsz_NewTitle[0] = '*';
  1946.     pMsz_NewTitle[1] = ' ';
  1947.     strcpy( &pMsz_NewTitle[2], pWiParams -> name_adr );
  1948.     
  1949.     Wnd_ChangeTitle( pWiParams, pMsz_NewTitle );
  1950. }
  1951.  
  1952.  
  1953. /*
  1954.  * Wnd_ClearModified(-)
  1955.  *
  1956.  * Purpose:
  1957.  * --------
  1958.  * EnlŠve le flag modified
  1959.  * et traduit cet ‚tat dans le titre de la fenˆtre
  1960.  *
  1961.  * History:
  1962.  * --------
  1963.  * 14.12.94: fplanque: Created
  1964.  */
  1965. void    Wnd_ClearModified(
  1966.             WIPARAMS    * pWiParams )    /* In: Fenˆtre concern‚e */
  1967. {
  1968.     char    *    pMsz_NewTitle;
  1969.     
  1970.     if( pWiParams -> WinFlags .b_modified == FALSE0 )
  1971.     {    /*
  1972.          * La fenˆtre n'‚tait pas modifi‚e:
  1973.          */
  1974.         return;
  1975.     }
  1976.     
  1977.     /*
  1978.      * Contenu de la fenˆtre a ‚t‚ sauv‚ maintenant:
  1979.      */
  1980.     pWiParams -> WinFlags .b_modified = FALSE0;    
  1981.     
  1982.     /*
  1983.      * Nouveau titre (le mˆme sans "* " au d‚but)
  1984.      */
  1985.     pMsz_NewTitle = STRDUP( &(pWiParams -> name_adr)[2] );
  1986.     
  1987.     Wnd_ChangeTitle( pWiParams, pMsz_NewTitle );
  1988. }
  1989.  
  1990.  
  1991. /*
  1992.  * Wnd_ChangeTitle(-)
  1993.  *
  1994.  * Purpose:
  1995.  * --------
  1996.  * Remplace le titre d'une fenˆtre
  1997.  *
  1998.  * History:
  1999.  * --------
  2000.  * 14.12.94: fplanque: Created
  2001.  */
  2002. void    Wnd_ChangeTitle(
  2003.             WIPARAMS    *     pWiParams,            /* In: Fenˆtre concern‚e */
  2004.             char        *    pMsz_NewTitle )    /* In: Ptr sur nouveau titre */
  2005. {
  2006.     /*
  2007.      * Affiche nouveau titre:
  2008.      */
  2009.       wind_set( pWiParams -> handle, WF_NAME, pMsz_NewTitle );
  2010.     
  2011.     /*
  2012.      * Efface l'ancien titre de la m‚moire:
  2013.      */
  2014.     free_String( pWiParams -> name_adr );
  2015.  
  2016.     /*
  2017.      * la fenˆtre M‚morise le nouveau titre:
  2018.      */
  2019.     pWiParams -> name_adr = pMsz_NewTitle;
  2020. }